package com.github.cakin.shiro.chapter23.remote;

import com.github.cakin.shiro.chapter23.service.AuthorizationService;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.Serializable;

/**
 * @className: RemoteService
 * @description: 远程服务实现
 * 使用 HTTP 调用器暴露为远程服务，这样其他应用就可以使用相应的客户端调用这些接口进行 Session 的集中维护及根据 AppKey
 * 和用户名获取角色 / 权限字符串集合。
 * @date: 2020/6/1
 * @author: cakin
 */
public class RemoteService implements RemoteServiceInterface {
    /**
     * authorizationService
     */
    @Autowired
    private AuthorizationService authorizationService;

    /**
     * sessionDAO
     */
    @Autowired
    private SessionDAO sessionDAO;
    /**
     * 功能描述：获得会话
     *
     * @author cakin
     * @date 2020/6/1
     * @param appKey 应用Key
     * @param sessionId sessionId
     * @return Session 会话
     */
    public Session getSession(String appKey, Serializable sessionId) {
        return sessionDAO.readSession(sessionId);
    }

    /**
     * 功能描述：创建会话
     *
     * @author cakin
     * @date 2020/6/1
     * @param session 会话
     * @return Serializable 主键
     */
    public Serializable createSession(Session session) {
        return sessionDAO.create(session);
    }

    /**
     * 功能描述：更新会话
     *
     * @author cakin
     * @date 2020/6/1
     * @param session 会话
     * @param appKey 应用key
     */
    public void updateSession(String appKey, Session session) {
        sessionDAO.update(session);
    }
    /**
     * 功能描述：删除会话
     *
     * @author cakin
     * @date 2020/6/1
     * @param session 会话
     * @param appKey 应用key
     */
    public void deleteSession(String appKey, Session session) {
        sessionDAO.delete(session);
    }
    /**
     * 功能描述：获取权限上下文
     *
     * @author cakin
     * @date 2020/6/1
     * @param username 用户名
     * @param appKey 应用key
     * @return PermissionContext 权限上下文
     */
    public PermissionContext getPermissions(String appKey, String username) {
        PermissionContext permissionContext = new PermissionContext();
        permissionContext.setRoles(authorizationService.findRoles(appKey, username));
        permissionContext.setPermissions(authorizationService.findPermissions(appKey, username));
        return permissionContext;
    }
}
